<?php
/*
 * Darek
 */

require_once 'db_class.php';
require_once 'wezel.php';

class BazaDanych
{
	private $db;
	
	//w przypadku błędu połączenia $this->db ma wartość null
	public function __construct()
	{
		$this->db = @new mysqli(DB_class::$host, DB_class::$user, DB_class::$pass, DB_class::$dbName);
		if (mysqli_connect_errno() != 0){
			echo '<p>Wystąpił błąd połączenia: ' . mysqli_connect_error() . '</p>';
			$this->db=null;
		}
	}
	
	public function __destruct()
	{
		if($this->db!==null)
			$this->db->close();
	}
	
	public function zwrocWezel($id)
	{
		if($this->db!==null && $id!==null)
		{
			$wezelBD=$this->db->query("SELECT * FROM wezly WHERE id_wezla = ".$id);
			$we=$wezelBD->fetch_assoc();
			
			if($we!==null)								//jeśli istnieje węzeł o podanym id
			{
				$osobaBD=$this->db->query("SELECT * FROM  osoba WHERE id_osoba =".$id);
				$os=$osobaBD->fetch_assoc();
				$osoba=new Osoba($os['id_osoba'], $os['imie'], $os['nazwisko'], $os['data_urodzenia'], $os['data_smierci'], $os['plec'], $os['zdjecie'], $os['notatka'], $os['nazwisko_panienskie']);
					
				//Znalezienie id partnera, jeśli nie ma to $idPartnera=null
				if(!$osoba->getPlec())	//jeżeli kobieta to znajdź id męża
				{
					$wezelBD=$this->db->query("SELECT * FROM wezly WHERE partner =".$id);
					$wePartnera=$wezelBD->fetch_assoc();
					if($wePartnera===null)
						$idPartnera=null;
					else
						$idPartnera=$wePartnera['id_wezla'];
				}
				else					//jeżeli mężczyzna to pobierz id żony
				{
					$idPartnera=$we['partner'];
				}
					
			
				//tworzenie węzła partnera
				if($idPartnera!==null)
				{
					$osobaBD=$this->db->query("SELECT * FROM  osoba WHERE id_osoba =".$idPartnera);
					$osPartnera=$osobaBD->fetch_assoc();
					$osobaPartnera=new Osoba($osPartnera['id_osoba'], $osPartnera['imie'], $osPartnera['nazwisko'], $osPartnera['data_urodzenia'], $osPartnera['data_smierci'], $osPartnera['plec'], $osPartnera['zdjecie'], $osPartnera['notatka'], $osPartnera['nazwisko_panienskie']);
			
					$wezelBD=$this->db->query("SELECT * FROM wezly WHERE id_wezla =".$idPartnera);
					$wePartnera=$wezelBD->fetch_assoc();
					$wezelPartnera=new Wezel($wePartnera['id_wezla'], null, $wePartnera['wlasciciel'], $osobaPartnera);
				}
				else
					$wezelPartnera=null;
					
				//tworzenie węzła
				$wezel=new Wezel($we['id_wezla'], $wezelPartnera, $we['wlasciciel'], $osoba);
					
				return $wezel;
			}
			else 					//jeśli nie istnieje węzeł o podanym id to zwróć null
				return null;
		}
		else 
			return null;
		
	}
	
	/*
	 * funkcja przyjmuje jako parametr Wezel, identyfikator nie jest brany pod uwagę
	 * funkcja zwraca identyfikator jaki został wygenerowany dla danego węzła
	 * jeśli operacja się nie powiedzie to metoda zwraca false
	 */
	public function dodajWezel(Wezel $wez)
	{
		if($this->db!==null)
		{
		//generowanie ID - maksymalny identyfikator + 1
			$maxBD=$this->db->query("SELECT MAX( id_wezla ) max FROM  wezly");
			$maxID=$maxBD->fetch_assoc();
			if($maxID['max']!==null)
				$identyfikator = $maxID['max']+1;
			else
				$identyfikator = 1;
			
			//jeśli w tabeli osoba jest więcej wpisów to wybierzemy największy id z tabeli osoba
			$maxBD=$this->db->query("SELECT MAX( id_osoba ) max FROM  osoba");	
			$maxID=$maxBD->fetch_assoc();
			if($maxID['max']!==null)
				$identyfikatoro = $maxID['max']+1;
			else
				$identyfikatoro = 1;
			
			if($identyfikatoro>$identyfikator)			//porównanie maxID(wezly) z maxID(osoba)
				$identyfikator=$identyfikatoro;
			
			
		//przygotowanie danych do wpisania do bazy + wartości NULL
			if($wez->getOsoba()->getPlec())		//zapisanie płci do zmiennej: mężczyzna=1, kobieta=0
				$plec=1;
			else
				$plec=0;
			if($wez->getRodzic()!==null) $rodzic="'{$wez->getRodzic->getId()}'"; else $rodzic='NULL';
			if($wez->getModerator()!==null) $moderator="'{$wez->getModerator()}'"; else $moderator='NULL';
			if($wez->getOsoba()->getDUint()!==null) $dataUrodzenia="'{$wez->getOsoba()->getDUint()}'"; else $dataUrodzenia='0';
			if($wez->getOsoba()->getDSint()!==null) $dataSmierci="'{$wez->getOsoba()->getDSint()}'"; else $dataSmierci='NULL';
			if($wez->getOsoba()->getNazwPanien()!==null) $nazwiskoPanienskie="'{$wez->getOsoba()->getNazwPanien()}'"; else $nazwiskoPanienskie='NULL';
			
			
		//dodanie danych do bazy
			$wynik=$this->db->query("INSERT INTO `osoba` (`imie`, `nazwisko`, `id_osoba`, `data_urodzenia`, `plec`, `zdjecie`, `notatka`, `nazwisko_panienskie`, `data_smierci`)
					VALUES ('{$wez->getOsoba()->getImie()}', '{$wez->getOsoba()->getNazwisko()}', '{$identyfikator}', {$dataUrodzenia},
					'{$plec}', NULL, NULL, {$nazwiskoPanienskie}, {$dataSmierci})");
			if(!$wynik) return false;
			$wynik=$this->db->query("INSERT INTO `wezly` (`id_wezla`, `rodzic`, `partner`, `wlasciciel`) VALUES ('{$identyfikator}', NULL, NULL, {$moderator})");
			if(!$wynik) return false;
			
			
			return $identyfikator;
		}
		else
			return false;
	}
	
	public function zwrocKorzen($id)
	{
		if($this->db!==null)
		{
			$licznik=0;
			do //szukanie w pętli korzenia - węzła który nie ma rodzica
			{
				$wezelBD=$this->db->query("SELECT * FROM wezly WHERE id_wezla = ".$id);
				$we=$wezelBD->fetch_assoc();
				if($we['rodzic']!==null)
					$id=$we['rodzic'];
				
				$licznik++;
				if($licznik>100)	//zabezpieczenie przed nieskończoną pętlą
				{
					echo '<p>Prawdopodobnie w drzewie występuje cykl. Liczba poziomów przekroczyła 100</p>';
					$we['rodzic']=null;			//to spowoduje przerwanie pętli przy najbliższym sprawdzeniu warunku
				}
			}
			while($we['rodzic']!==null);

			return $this->zwrocWezel($we['id_wezla']);
		}
	}
	
	public function zwrocDzieci($id)
	{
		if($this->db!==null)
		{
			$wezelBD=$this->db->query("SELECT * FROM wezly WHERE rodzic = ".$id);
			$dzieci=array();
			//pobranie w pętli kolejnych rekordów zapytania zwracającego dzieci danego węzła
			while(($we=$wezelBD->fetch_assoc())!==null)
			{
				$dzieci[]=$this->zwrocWezel($we['id_wezla']);
			}
			
			return $dzieci;
		}
	}
}

?>